/*
    GNU GENERAL LICENSE
    Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2016 Lobo Evolution

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public
    License as published by the Free Software Foundation; either
    verion 3 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General License for more details.

    You should have received a copy of the GNU General Public
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    

    Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
 */
package org.lobobrowser.http;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.ws.Response;

/**
 * Represents a header field in an http {@link Request} or {@link Response}.
 *
 * @author rbair
 */
public class Header extends NameValuePair {
    /** The elements. */
    private List<Element> elements = new ArrayList<Element>();
    
    /**
     * Creates a new Header with a null name and value, and no elements.
     */
    public Header() {
    }
    
    /**
     * Creates a new Header with the given name and value, and no elements.
     *
     * @param name
     *            The name. May be null.
     * @param value
     *            The value. May be null.
     */
    public Header(String name, String value) {
        super(name, value);
    }
    
    /**
     * Creates a new Header with the given name, value, and elements. If
     * <code>elements</code> is null, then an empty set of elements will be used
     * instead.
     *
     * @param name
     *            The name. May be null.
     * @param value
     *            The value. May be null.
     * @param elements
     *            The elements. May be null. If null, then getElements() will
     *            return an empty array, rather than null.
     */
    public Header(String name, String value, Element... elements) {
        super(name, value);
        setElements(elements);
    }
    
    /** Gets the elements.
	 *
	 * @return the elements
	 */
    public Element[] getElements() {
        return elements.toArray(new Element[0]);
    }
    
    /** Sets the elements.
	 *
	 * @param elements
	 *            the new elements
	 */
    public void setElements(Element... elements) {
        Element[] old = getElements();
        this.elements.clear();
        if (elements != null) {
            this.elements.addAll(Arrays.asList(elements));
        }
        firePropertyChange("elements", old, getElements());
    }
    
    /*
     * (non-Javadoc)
     * @see org.lobobrowser.util.NameValuePair#toString()
     */
    @Override
    public String toString() {
        return getName() + ": " + getValue();
    }
    
    /**
     * A representation of an Element within a Header.
     */
    public static final class Element {
        /** The params. */
        private Parameter[] params = new Parameter[0];
        
        /**
         * Create a new instance of Element with the given params.
         *
         * @param params
         *            the Parameters. May be null.
         */
        public Element(Parameter... params) {
            if (params == null) {
                this.params = new Parameter[0];
            } else {
                this.params = new Parameter[params.length];
                System.arraycopy(params, 0, this.params, 0, this.params.length);
            }
        }
        
        /** Gets the parameters.
		 *
		 * @return the parameters
		 */
        public Parameter[] getParameters() {
            Parameter[] dest = new Parameter[params.length];
            System.arraycopy(params, 0, dest, 0, params.length);
            return dest;
        }
    }
}
